/*
 * Tasks_can.cpp
 *
 *  Created on: 2019-4-26
 *      Author: root
 */
#include <stddef.h>
#include "Tasks_can.h"
#include "tcu_can.h"
#include "sys.h"
#include <string.h>
#include "sys.h"
#include "Task_Timer.h"
#include "protocol_can.h"
#include "app_debug_can.h"
#include <unistd.h>
TTaskInfo Info_TaskRecvPort[GUN_NUM];
TTaskInfo Info_TaskSendPort[GUN_NUM];
static RecvPara recvpara[GUN_NUM];

OS_TaskRet TasksSendPort(void* arg) {
	SendPara para = *(SendPara*) arg;
	int qmegid = para.qid;
	u8 gunid=para.phy_gunno;

	msgtcu msgs;
	int ret_value;
	//int ret;
	GW_Can gwcan;
	printf("TasksSendPort--init  gunid=%d  qmegid=%d\r\n",gunid,qmegid);//##libcan## recv pf=13 , but break
	sleep(1);

	while (1) {

//		if(g_can[gunid].curpf==TCU_CMD_CHARGE_START)
//		{
//	          can_pro_debug1("TasksSendPort");
//              printf("\r\n\r\n第 %d号枪当前状态 state=%d  pf=%x  gpcan_para->data2main->errcode[gunid]=%d\r\n\r\n",gunid,g_can[gunid].state,g_can[gunid].curpf,gpcan_para->data2main->errcode[gunid]);
//		}
		qmegid = para.qid;
		ret_value = os_rev_msgqueue(qmegid, (u8*) &msgs, sizeof(msgtcu), 0, 10);
		if (ret_value >= 0) {
		//	printf("gunid=%d  本次接收qid=%d\n\n",gunid,qmegid);

			memcpy((u8*) &gwcan, msgs.pmsg, sizeof(GW_Can));
			AnalyzeData(gunid, gwcan.pf, gwcan.lendata, gwcan.pdata);
		}



		 timed2Cha(gunid);

//		 printf("我还在 我还在 gunid =%d  qid=%d  \n\n",gunid,qmegid);//貌似发生了重复发送现象data
////
//		 if(g_can[gunid].state == HEART_BEAT_FIRST)
//		 {
//			 printf("8888888888888888888888888 gunid=%d\n",gunid);
//			continue;
//		 }
//		 else if(g_can[gunid].state == TCU_IDEL)
//		 {
//			 printf("999999999999999999999 gunid=%d\n",gunid);
//			continue;
//		 }

		// printf("77777777777777777777    gunid=%d state=%d \n",gunid,g_can[gunid].state);
   	     auto2Cha(gunid);

	}

	return NULL;
}
OS_TaskRet TasksRecvPort(void* arg)
{

	RecvPara para=*(RecvPara*)arg;
	int qmegid=para.qid;
	u8 port=para.port;
	u8 addr=para.addr;
	msgtcu msgs;
	int ret_value;
	int ret;
	printf(" Info_TaskRecvPort port =%d   qid=%d\r\n",para.port,qmegid);
	while(1)
	{

//		if(port==1)
//			printf("00000000000000TasksRecvPort port=1 qmegid=%d\n  ",qmegid);
        ret_value =os_rev_msgqueue(qmegid, (u8*)&msgs,sizeof(msgtcu),0,10);
		if(ret_value>=0)
		{
//			if(port==1)
//			printf("11111111111111TasksRecvPort port=1 qmegid=%d\n  ",qmegid);
            ret=handleRecvPort(port,addr,&msgs);

		}
//		else
//		{
//			if(port==1)
//			    printf("2222222222222TasksRecvPort port=1 qmegid=%d  \n",qmegid);
//			else
//
//		}
	   // printf("我也在 我也在 qid=%d port=%d \n\n",qmegid,port);//貌似发生了重复发送现象data第三步：发送对时命令
	}


	return NULL;
}

void initTasksCan(void *pcan)
{
	int i=0;
	canlink *p;
	key_t key=0;

  // RecvPara recvpara;
	initcan(); //到充电指令返回
     memcpy((u8*) gpcan_para, (u8*) pcan, sizeof(Para_Can));



	if (gpcan_para->cannum == 2) {
		p = gpcan_para->p_can[1];

		while (p != NULL) {
	    	printf("对链表上的节点生成任务Info_TaskRecvPort  port=1   qid=%d\r\n",p->qid);
			Info_TaskRecvPort[i].Prio = DEFAULT_PRIO;
			Info_TaskRecvPort[i].Stk_Size = 0;
			Info_TaskRecvPort[i].Stk = NULL;
			recvpara[i].addr = p->addr;
			recvpara[i].port = 1;
			recvpara[i].qid = p->qid;

			os_create_task(TasksRecvPort, (void*)&recvpara[i],
					&Info_TaskRecvPort[i]);
			p = p->pNext;
			i++;
	//		sleep(1);
		}
	}


    p=gpcan_para->p_can[0];
    while(p!=NULL)
    {
    	printf("对链表上的节点生成任务Info_TaskRecvPort  port=0   qid=%d\r\n",p->qid);
    	Info_TaskRecvPort[i].Prio=DEFAULT_PRIO;
    	Info_TaskRecvPort[i].Stk_Size=0;
    	Info_TaskRecvPort[i].Stk=NULL;
    	recvpara[i].addr=p->addr;
    	recvpara[i].port=0;
    	recvpara[i].qid=p->qid;
    	os_create_task(TasksRecvPort, (void*)&recvpara[i],&Info_TaskRecvPort[i]);
    	p=p->pNext;
    	i++;
 //   	sleep(1);
    }


    for(i=0;i<gpcan_para->gunnum;i++)
    {
    	sendpara[i].phy_gunno=i;
    	key=0;
    	sendpara[i].qid=os_create_msgqueue(&key,1);
    	Info_TaskSendPort[i].Prio=DEFAULT_PRIO+2;
    	Info_TaskSendPort[i].Stk_Size=0;
    	Info_TaskSendPort[i].Stk=NULL;
		os_create_task(TasksSendPort, (void*) &sendpara[i],
				&Info_TaskRecvPort[i]);
		sleep(1);
    }




}
